<?php
namespace Mouta\UserBundle\Solr;

use Mouta\AmistateBundle\Entity\Usuario;
use Mouta\AmistateBundle\Entity\Image;
use Gedmo\Sluggable\Util\Urlizer;

class SolrManager
{
	protected $_Host;
	protected $_Port;
	protected $_Path;
	protected $_Solr;
	
	public function __construct($host,$port,$path) {
		$this->_Host = $host;
		$this->_Port = $port;
		$this->_Path = $path;
		
		$this->_Solr = new \Apache_Solr_Service($host,$port,$path);
	}
	
	protected function validarUsuario(Usuario $usuario)
	{
		$add = true;
		if(!$usuario->getDescripcion())
		{
			$add = false;
		}
		
		if(!$usuario->getVerificado())
		{
			$add = false;
		}
		
		return $add;
		
	}
	
	public function checkAndProcessUser(Usuario $usuario)
	{
		if($this->validarUsuario($usuario))
		{
			$this->addOrUpdateUser($usuario);
		} else {
			$this->DeleteUser($usuario);
		}
		
	}
	
	public function addOrUpdateUser(Usuario $usuario)
	{
        $document = new \Apache_Solr_Document();
        $document->addField('id', $usuario->getId());
        $document->addField('nombre', $usuario->getNombre());
        $document->addField('slug', $usuario->getSlug());
        $document->addField('para', $usuario->getPara());
        $document->addField('cumple', $usuario->getCumple()->format('Y-m-d')."T23:59:59Z");
        $document->addField('ultima_actividad', $usuario->getUltimaActividad()->format('Y-m-d')."T23:59:59Z");
        $document->addField('descripcion', $usuario->getDescripcion());
        $document->addField('sexo', $usuario->getSexo());
        $document->addField('busco', $usuario->getBusco());
        $document->addField('pais', $usuario->getPais());
        $document->addField('provincia', $usuario->getProvincia());
        $document->addField('ciudad', $usuario->getLocalidad());
        $document->addField('puntos', $usuario->getPuntos());
        $document->addField('votos', $usuario->getVotos());
        if( $usuario->getLng() )
            $document->addField('coordenadas', $usuario->getLat().','.$usuario->getLng());
        
        foreach($usuario->getTags() as $tag)
        {
            $document->addField('tags', $tag->getTagGoogle());
        }
        $document->addField('tags', $usuario->getSeoUbicacion().'-');
        
        $imgDef = $usuario->getImageDefault(false);
		
        if($imgDef)
		{
			$document->addField('fotodefault', $imgDef->getPath());
			$document->addField('tienefoto', 1);
		} else {
			$document->addField('tienefoto', 0);
		}
        
        $this->_Solr->addDocument($document);
        $this->_Solr->commit();
	}
	
	public function DeleteUser(Usuario $user){
        $this->_Solr->deleteById($user->getId());
        $this->_Solr->commit();
    }
	
	public function find($q, $offset, $limit, $params = array())
	{
		$defaultParams = array(
			'sort'=>'tienefoto desc, ultima_actividad desc'
		);
		$params = array_merge($defaultParams,$params);
		
		$results = $this->_Solr->search($q, $offset, $limit, $params);
		return $this->parseResults($results);
	}
	
	public function parseResults($results)
	{
		$facets = array();
		if(isset($results->facet_counts->facet_fields))
		{
			foreach($results->facet_counts->facet_fields as $field)
			{
				foreach($field as $value => $cant)
				{
					if($value != "_empty_")
					{
						$facets[$value] = $cant;
					}
				}
				
			}
		}
			
		$docs = $results->response->docs;
		$usuarios = array();
		foreach($docs as $doc)
		{
			$usuario = new Usuario();
            $usuario->setSolrId($doc->id);
            $usuario->setNombre($doc->nombre);
            $usuario->setSlug($doc->slug);
            $usuario->setPara($doc->para);
            $usuario->setCumple( new \DateTime($doc->cumple));
            $usuario->setUltimaActividad( new \DateTime($doc->ultima_actividad));
            $usuario->setDescripcion( $doc->descripcion);
            $usuario->setSeoPais(Urlizer::urlize($doc->pais));
            $usuario->setPais( $doc->pais);
            $usuario->setSeoProvincia(Urlizer::urlize($doc->provincia));
            $usuario->setProvincia( $doc->provincia);
			$usuario->setLocalidad( $doc->ciudad);
			$usuario->setSeoLocalidad( Urlizer::urlize($doc->ciudad));
            $usuario->setPuntos( $doc->puntos);
            $usuario->setVotos( $doc->votos);
			if(isset($doc->coordenadas_0_coordinate)) $usuario->setLat( $doc->coordenadas_0_coordinate);
            if(isset($doc->coordenadas_1_coordinate)) $usuario->setLng( $doc->coordenadas_1_coordinate);
			
			if($doc->sexo)
                $usuario->setSexo(1);
            else
                $usuario->setSexo(0);
			
            if($doc->busco)
                $usuario->setBusco(1);
            else
                $usuario->setbusco(0);
            
            if($doc->fotodefault){
                $imagen = new \Mouta\AmistateBundle\Entity\Image();
                $imagen->setPath($doc->fotodefault);
                $imagen->setPrincipal(true);
                $imagen->setUsuario($usuario);
                $usuario->addImage($imagen);
            }
			$usuarios[] = $usuario;
		}
		
		$total = (int) $results->response->numFound;
		
		$return = array();
		$return['total'] = $total;
		$return['usuarios'] = $usuarios;
		$return['facets'] = $facets;
		
		return $return;
	}
}